Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_auto_propagation.py

Displaying Raw • Download


tests/backend/test_auto_propagation.py 64e4fceb2d8acf83803b97a87ea8168489fcd0ec (64e4fceb) Text, 4.06 KB

Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch

Tff7b72import T7ee787pytest
Tff7b72import T7ee787RNS

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787auto_propagation_manager Tff7b72import Te6edf3AutoPropagationManager


Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_auto_propagation_logicTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# Mock dependencies
Te6edf3app Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3context Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3config Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3database Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)

Te6edf3contextTff7b72.Td2a8ffconfig Tff7b72= Te6edf3config
Te6edf3contextTff7b72.Td2a8ffdatabase Tff7b72= Te6edf3database
Te6edf3contextTff7b72.Td2a8ffidentity_hash Tff7b72= Ta5d6ff"Ta5d6fftest_identityTa5d6ff"
Te6edf3contextTff7b72.Td2a8ffrunning Tff7b72= Tff7b72True

Te6edf3manager Tff7b72= Te6edf3AutoPropagationManagerTb4b4b4(Te6edf3appTb4b4b4, Te6edf3contextTb4b4b4)

T8b949e# 1. Test disabled state
Te6edf3configTff7b72.Td2a8fflxmf_preferred_propagation_node_auto_selectTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72False
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3managerTb4b4b4, Ta5d6ff"Ta5d6ffcheck_and_update_propagation_nodeTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_checkTb4b4b4:
T8b949e# Run one iteration manually
Tff7b72if Te6edf3configTff7b72.Td2a8fflxmf_preferred_propagation_node_auto_selectTff7b72.Td2a8ffgetTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72await Te6edf3managerTff7b72.Td2a8ffcheck_and_update_propagation_nodeTb4b4b4(Tb4b4b4)
Te6edf3mock_checkTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)

T8b949e# 2. Test selection logic
Te6edf3configTff7b72.Td2a8fflxmf_preferred_propagation_node_auto_selectTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3configTff7b72.Td2a8fflxmf_preferred_propagation_node_destination_hashTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72None

T8b949e# Mock announces
Te6edf3announce1 Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaaaa1111Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapp_dataTa5d6ff"Tb4b4b4: Ta5d6ffbTa5d6ff"Tffea00\x94Tffea00\x00Tffea00\x00Tffea00\x01Tffea00\x00Ta5d6ff"Tb4b4b4, T8b949e# msgpack for [0, 0, 1, 0] -> enabled=True
Tb4b4b4}
Te6edf3announce2 Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbbbb2222Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffapp_dataTa5d6ff"Tb4b4b4: Ta5d6ffbTa5d6ff"Tffea00\x94Tffea00\x00Tffea00\x00Tffea00\x01Tffea00\x00Ta5d6ff"Tb4b4b4}
Te6edf3databaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announcesTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[Te6edf3announce1Tb4b4b4, Te6edf3announce2Tb4b4b4]

T8b949e# Mock RNS Transport
Tff7b72with Tb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Ta5d6ff"Ta5d6ffhas_pathTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Ta5d6ff"Ta5d6ffhops_toTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_hopsTb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3managerTb4b4b4, Ta5d6ff"Ta5d6ffprobe_nodeTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e# announce1 is closer (1 hop)
T8b949e# announce2 is further (3 hops)
Te6edf3mock_hopsTff7b72.Td2a8ffside_effect Tff7b72= Tff7b72lambda Te6edf3dhTb4b4b4: T79c0ff1 Tff7b72if Te6edf3dh Tff7b72== Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffaaaa1111Ta5d6ff"Tb4b4b4) Tff7b72else T79c0ff3

Tff7b72await Te6edf3managerTff7b72.Td2a8ffcheck_and_update_propagation_nodeTb4b4b4(Tb4b4b4)

T8b949e# Should have selected aaaa1111
Te6edf3appTff7b72.Td2a8ffset_active_propagation_nodeTff7b72.Td2a8ffassert_called_withTb4b4b4(Ta5d6ff"Ta5d6ffaaaa1111Ta5d6ff"Tb4b4b4, Te6edf3contextTff7b72=Te6edf3contextTb4b4b4)
Te6edf3configTff7b72.Td2a8fflxmf_preferred_propagation_node_destination_hashTff7b72.Td2a8ffsetTff7b72.Td2a8ffassert_called_withTb4b4b4(
Ta5d6ff"Ta5d6ffaaaa1111Ta5d6ff"Tb4b4b4,
Tb4b4b4)

T8b949e# 3. Test switching to better node
Te6edf3configTff7b72.Td2a8fflxmf_preferred_propagation_node_destination_hashTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffbbbb2222Ta5d6ff"
Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffset_active_propagation_nodeTff7b72.Td2a8ffreset_mockTb4b4b4(Tb4b4b4)

Tff7b72with Tb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Ta5d6ff"Ta5d6ffhas_pathTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Ta5d6ff"Ta5d6ffhops_toTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_hopsTb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3managerTb4b4b4, Ta5d6ff"Ta5d6ffprobe_nodeTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3mock_hopsTff7b72.Td2a8ffside_effect Tff7b72= Tff7b72lambda Te6edf3dhTb4b4b4: T79c0ff1 Tff7b72if Te6edf3dh Tff7b72== Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffaaaa1111Ta5d6ff"Tb4b4b4) Tff7b72else T79c0ff3

Tff7b72await Te6edf3managerTff7b72.Td2a8ffcheck_and_update_propagation_nodeTb4b4b4(Tb4b4b4)

T8b949e# Should have switched to aaaa1111 because it's closer
Te6edf3appTff7b72.Td2a8ffset_active_propagation_nodeTff7b72.Td2a8ffassert_called_withTb4b4b4(Ta5d6ff"Ta5d6ffaaaa1111Ta5d6ff"Tb4b4b4, Te6edf3contextTff7b72=Te6edf3contextTb4b4b4)

T8b949e# 4. Test failover when probe fails
Te6edf3configTff7b72.Td2a8fflxmf_preferred_propagation_node_destination_hashTff7b72.Td2a8ffgetTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffcccc3333Ta5d6ff"
Tb4b4b4)
Te6edf3announce3 Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcccc3333Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffapp_dataTa5d6ff"Tb4b4b4: Ta5d6ffbTa5d6ff"Tffea00\x94Tffea00\x00Tffea00\x00Tffea00\x01Tffea00\x00Ta5d6ff"Tb4b4b4}
Te6edf3databaseTff7b72.Td2a8ffannouncesTff7b72.Td2a8ffget_announcesTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[Te6edf3announce1Tb4b4b4, Te6edf3announce3Tb4b4b4]
Te6edf3appTff7b72.Td2a8ffset_active_propagation_nodeTff7b72.Td2a8ffreset_mockTb4b4b4(Tb4b4b4)

Tff7b72with Tb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Ta5d6ff"Ta5d6ffhas_pathTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Ta5d6ff"Ta5d6ffhops_toTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_hopsTb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3managerTb4b4b4, Ta5d6ff"Ta5d6ffprobe_nodeTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_probeTb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e# announce1 is 1 hop, but probe fails
T8b949e# announce3 is 2 hops, probe succeeds
Te6edf3mock_hopsTff7b72.Td2a8ffside_effect Tff7b72= Tff7b72lambda Te6edf3dhTb4b4b4: T79c0ff1 Tff7b72if Te6edf3dh Tff7b72== Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffaaaa1111Ta5d6ff"Tb4b4b4) Tff7b72else T79c0ff2
Te6edf3mock_probeTff7b72.Td2a8ffside_effect Tff7b72= Tb4b4b4(
Tff7b72lambda Te6edf3dhTb4b4b4: Tff7b72False Tff7b72if Te6edf3dh Tff7b72== Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffaaaa1111Ta5d6ff"Tb4b4b4) Tff7b72else Tff7b72True
Tb4b4b4)

Tff7b72await Te6edf3managerTff7b72.Td2a8ffcheck_and_update_propagation_nodeTb4b4b4(Tb4b4b4)

T8b949e# Should NOT switch to aaaa1111 because probe failed
T8b949e# Should STAY on cccc3333 or switch to it if it was different
T8b949e# Since it's already on cccc3333 and it's the best reachable, no switch
Te6edf3appTff7b72.Td2a8ffset_active_propagation_nodeTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────